#ifndef SAS_NUC_COMMUNICATE_H
#define SAS_NUC_COMMUNICATE_H
#include "struct_typedef.h"
#include "debug_config.h"
#include "robot_config.h"
#include "referee.h"

#define MESSAGE_START 'S'  // 开始标志
#define MESSAGE_END 'E'    // 结束标志

#define NUC_DATA_AVAILABLE 1
#define NUC_DATA_NOT_AVAILABLE 0

#define NUCINFO_FRAME_LENGTH 40
#define NUCINFO_RX_BUF_NUM 2*NUCINFO_FRAME_LENGTH

#ifdef USE_USART
typedef struct {
    uint8_t start : 8;     // 开始符号，'S'
    int8_t pitch : 8;      // 云台旋转动作，向上为正
    int16_t yaw : 16;      // 云台旋转动作，逆时针为正
    #ifdef SENTRY
    int8_t pitchWithoutIMU : 8;      // 云台旋转动作，向上为正
    int16_t yawWithoutIMU : 16;      // 云台旋转动作，逆时针为正
    #endif
    int16_t x : 16;        // 云台坐标系下,底盘的x速度
    int16_t y : 16;        // 云台坐标系下,底盘的y速度
    int16_t w : 16;        // 云台坐标系下,底盘的角速度w
    uint8_t shoot : 8;     // 是否发射（拨弹轮启动）
    #ifdef SENTRY
    uint8_t shootUp : 8;  // 保留位,默认为0
    #else
    uint8_t reserved : 8;  // 保留位,默认为0
    #endif
    uint8_t checksum : 8;  // 校验和
    uint8_t end : 8;       // 结尾标志符号，'E'
} fromNUC_t;

enum myColor_e {
    COLOR_RED = 0,
    COLOR_BLUE = 1,
};

#ifdef TEST_USART
typedef fromNUC_t toNUC_t ;
#else 
typedef struct
{
    uint32_t start;                 // 开始符号，'S'
    uint32_t blood : 12;            // 剩余血量，不会高于4096
    uint32_t bullet_remaining : 12; // 剩余子弹，不会高于4096
    uint32_t my_color : 8;          // 本方颜色，32bit对齐
    uint32_t checksum;              // 校验和，前方所有数据按32bit分段直接相加
    uint32_t end;                   // 结束符号，'E'
}toNUC_t;
#endif

const fromNUC_t *get_nuc_control_point(void);
int found_armor(void);
int found_armorUp(void);
void gimbal_clear_read_mark(void);
void gimbal_set_read_mark(void);
int gimbal_NUC_is_available(void);
int shoot_NUC_is_available(void);
void shoot_clear_read_mark(void);
void shoot_set_read_mark(void);
const remote_control_t* get_usart_remote_control_p(void);
void to_nuc_send_task(void const *pvParameters);
#endif
#endif
